package com.java.nettydemo.bio;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1、IO代码里read操作是阻塞操作，如果连接不做数据读写操作会导致线程阻塞，浪费资源
 * 2、如果线程很多，会导致服务器线程太多，压力太大，比如C10K问题
 * 应用场景：
 * BIO 方式适用于连接数目比较小且固定的架构， 这种方式对服务器资源要求比较高，  但程序简单易理解。
 */
public class SocketServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9000);

        System.out.println("等待连接");

        while (true){
            Socket cilentSocket = serverSocket.accept();
            System.out.println("有客户端连接了");

           // handler(cilentSocket);

        new Thread(() ->{
            try {
                while (true){
                    int handler = handler(cilentSocket);
                    if (handler == -1){
                        break;
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        }
    }

    private static int handler(Socket clientSocket) throws IOException {
        byte[] bytes = new byte[1024];
        System.out.println("准备read。。");
        //接收客户端的数据，阻塞方法，没有数据可读时就阻塞
        int read = clientSocket.getInputStream().read(bytes);
        System.out.println("read完毕。。");
        if (read != -1) {
            System.out.println("接收到客户端的数据：" + new String(bytes, 0, read));
        }else {
            return -1;
        }
        clientSocket.getOutputStream().write("HelloClient".getBytes());
        clientSocket.getOutputStream().flush();
        return 0;
    }
}
